package com.example.lcpractice.heading_offer;

/**
 * [剑指 Offer 64]求1+2+…+n.java
 *  求 1+2+...+n ，要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。
 *
 * 示例 1：
 *
 * 输入: n = 3
 * 输出: 6
 * 示例 2：
 *
 * 输入: n = 9
 * 输出: 45
 * 限制：
 *
 * 1 <= n <= 10000
 * Related Topics
 * 位运算
 * 递归
 * 脑筋急转弯
 */
public class q64 {
    public static void main(String[] args) {
//        System.out.println(sum(3));
        System.out.println(sumNums(4));
    }

    public static int sumNums(int n) {
        /*
        * 此处是求和
        * 限制是：
        * 要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。
        * 那么考虑到用递归
        *  sum(total)
        *
        *
        int sum(int total){
            if(total>0){
                return total += sum(total - 1);
            }
            return 0;
        }
        *
        *
        * 递归的难点是 禁止使用判断语句
        * 那么此处为了中断递归，考虑用短路运算符 +  >、<、== 中断递归
        *
        *
        * 最后
        * n=0不满足递归条件短路执行下一步return 0;
        * 倒数第二部 n=1接收到返回值 0返回和 1
        * 倒数第三部 n=2接收到返回值 1返回和 3
        * 倒数第三部 n=3接收到返回值 3返回和 6
        * ···
        * */
        boolean flag = n > 0 && (n += sumNums(n - 1)) > 0;
        return n;
    }


    static int sum(int total){
        if(total>0){
            return total += sum(total - 1);
        }
        return 0;
    }
}
